CloudWatch Logsの保持期間をAWS Configでチェックして自動設定する
CloudWatch Logsは様々なログを格納することができて便利ですが、デフォルトでは保持期間が設定されません。
無駄なコストを抑えるために保持期間を「AWS Config」でチェックして、保持期間が設定されていなければ通知&自動設定してみたいと思います。
AWS Configのルール作成
最初にAWS Configのコンソールから、CloudWatch Logsの保持期間をチェックするルールを作成します。
ログの保持期間をチェックするルールはAWSから提供されています。
検索ボックスで「cw-loggroup」などで検索して、該当のルール「cw-loggroup-retention-period-check」を選択してください。
必要に応じて名前や、トリガー、パラメーターを設定してください。トリガーの頻度(チェックする間隔)は「1時間」「3時間」「6時間」「12時間」「24時間」から選択できます。
パラメーターは、チェックしたいロググループを「LogGroupNames」に個別に指定することも可能ですが、今回は全てをチェック対象にしたいので指定はしていません。 (自分以外のユーザーがLambda関数を追加した際なども、自動でログ保持期間を設定したい為です)
「MinRetentionTime」はチェックする保持期間(日)です。ここで指定した日数より短い保持期間の場合に「非準拠」として検知します。指定がなければデフォルトで365日になります。
レビュー画面で問題なければ「ルールの追加」をクリックしてルールを作成します。
ルールを作成すると初回チェックがおこなわれます。下記は2件のロググループがルールに準拠していないことを検知しています。
実際にCloudWatch Logsのロググループは下記のように「保持期間」を設定していません。
先程のルール画面で該当ルールをクリックすると詳細が表示されます。下記画像の「注釈欄」にあるように、先程の2つのロググループに保持期間が無い旨のメッセージが出ています。
SNS Topicの作成
次に非準拠なリソースを検知した際にメール通知する設定を行います。作業の詳細は省略しますが、Amazon SNSにて下記のように通知先のメールアドレスをサブスクリプションに登録しましょう。
修復アクション用のIAM Roleの作成
修復アクションとは
ルールに非準拠なリソースを検知した際に、メール通知など何らかのアクションを実行することができます。このアクションのことを「修復アクション」といいます。
修復アクションは、必ずしも非準拠な状態を正しい状態に修復する必要はありません。ログ保持期間であれば、内容によっては半年で破棄していいものや、1年間は保持が必要なものなど、ログにより要件が異なる場合が考えられます。
そのため修復アクションで、メール通知のみ行い保持期間の設定は担当者が個別に設定するといった運用が必要な場合があります。
メール通知する修復アクションのIAM Role
まずはメール通知を試してみようと思うので、下記のようにsns:Publish
の権限を持ったIAM Roleを作成します。
(保持期間の自動設定は後ほど紹介します)
修復アクションはSystems Mangerの「Automation」というサービスで実行されるので、SSMの信頼関係を設定しておきます。
AWS Configのルール変更
先程作成したルールには修復アクションが設定されていないので、まずは「メール通知する修復アクション」を設定してみましょう。
AWS Configの画面より、該当のルールを選択して「アクション」から「修復の管理」を選択します。
各項目を次のように選択します。
設定項目 | 設定内容 |
---|---|
修復方法 | 自動修復 |
修復アクションの詳細 | AWS-PublishSNSNotification(推奨) |
修復アクションの「AWS-PublishSNSNotification」はSystems Managerで提供されているAWSマネージドなAutomationのドキュメントです。
SNS通知するためのパラメータも設定します。
パラメーター | 設定内容 |
---|---|
TopicArn | 先程作成した通知用SNSトピックのARN |
Message | 通知メールに記載するメッセージ。適当なものを作成してください。 |
AutomationAssumeRole | 修復アクション実行に必要なIAM Role。先程作成したIAM RoleのARNを指定。 |
修復アクションが設定できたら確認してみます。AWS Configのルールから「再評価」を選択します。
再度ルールのチェックが実行されるので、修復アクションが実行されて通知メールが届きました。
(非準拠のロググループが2つあったので、同じメールが2通届きました)
ルールの評価結果も下記のように、修復アクションが実行されたことが分かります。
Automation Documentの作成
非準拠なリソース発見時のメール通知は、AWSマネージドなAutomationドキュメントを利用することで簡単に設定できました。
しかし、CloudWatch Logsのロググループの保持期間を自動設定するドキュメントは提供されていないのでユーザーが作成する必要があります。
Systems Mangerのコンソール画面から「ドキュメント」の画面を開いて作成していきます。
名前は適当なものを設定してください。下記では「SetCloudWatchLoggroupRetentionDays」としています。肝心のドキュメントの内容ですが、今回は「エディタ」で直接作成します。
エディタが開いたら、次のようにドキュメントのコードを貼り付けて、「新しいバージョンの作成」をクリックします。
(新規作成の場合は画面下の「新しいバージョンをデフォルトとして設定」というチェックボックスはありません。下記の画像は既存ドキュメントを修正した為に表示されているものです)
貼り付けるドキュメントのコード内容は下記です。
非準拠のロググループがあれば次のアクションを実行します。
- 保持期間を365日に設定(デフォルト)
- メールの「件名」と「本文」に対象のロググループ名を記載して通知
description: Set CloudWatch Log Group Retension period schemaVersion: '0.3' assumeRole: '{{ AutomationAssumeRole }}' parameters: AutomationAssumeRole: type: String description: (Required) The ARN of the role that allows Automation to perform the actions on your behalf. logGroupName: type: String description: (Required) The name of CloudWatch Loggroup. retentionInDays: type: Integer description: (Optional) Retention Days of cloudwatch loggroup. default 365 days. default: 365 BasePublishMessage: type: String description: (Optional) The message to include in the SNS notification. default: There is no retentionInDays set for the cloudwatch logs. And set RetentionInDays the logs. SnsTopicARN: type: String description: (Required) The ARN of the SNS topic to publish the notification to. BaseNotificationSubject: type: String description: (Optional) Subject of the notification. default: CloudWatch Logs Retention Check mainSteps: - name: PutRetentionPolicy action: 'aws:executeAwsApi' inputs: Service: logs Api: PutRetentionPolicy logGroupName: '{{logGroupName}}' retentionInDays: '{{retentionInDays}}' - name: PublishMessage action: 'aws:executeAwsApi' inputs: Service: sns Api: Publish Message: '{{logGroupName}} : {{ BasePublishMessage }}' TopicArn: '{{ SnsTopicARN }}' Subject: '{{ BaseNotificationSubject }} - {{logGroupName}}' isEnd: true
ドキュメントの中でパラメーターをいくつか設定していますが、それぞれの意味は「詳細」タブで確認可能です。
名前 | 説明 |
---|---|
AutomationAssumeRole | (必須)修復アクションに必要なIAM RoleのArn |
logGroupName | (必須)修復対象のCloudWatch Logsのロググループ |
retentionInDays | (オプション)ロググループの保持期間(デフォルトで365日) |
BasePublishMessage | (オプション)メール通知するメッセージ内容 |
SnsTopicARN | (必須)メール通知するSNS TopicのArn |
BaseNotificationSubject | (オプション)通知メールの件名 |
参考ページ:Systems Manager オートメーションアクションのリファレンス - AWS Systems Manager
ロググループの保持期間を設定する修復アクションのIAM Role
先程作成したIAM Roleはメール通知する権限のみでした。このIAM Roleにロググループの保持期間を設定する権限logs:PutRetentionPolicy
を追加します。
(今回はインラインポリシーとして追加しています。)
修復アクションの再設定
次にAWS Configの修復アクションを変更します。既存のアクションを編集する場合、うまくパラメーターが設定できなかったので、メール通知する修復アクションを削除して再設定します。
改めて「修復の管理」を選択して新しいアクションを設定します。
修復アクションのプルダウンから、先程作成したAutmationを選択しましょう。
新たに修復アクションを設定し直した場合、パラメーターが次のように表示されているはずです。
パラメーターは次のように設定してください。
項目 | 設定内容 |
---|---|
リソースIDパラメータ | logGroupName |
今回は、ルールに非準拠なルールに対して自動修復(保持期間の設定)を行いますが、対象のロググループを指定する必要があります。AWSを利用しているとLambdaの追加時など任意のタイミングでロググループが作成されることがあるので、チェックのタイミングでロググループを指定するのは困難ですね。
「リソースIDパラメータ」を使うことで、非準拠のリソースIDを修復アクションに渡すことができるので、今回は「logGroupName」を指定します。
その他のパラメータ設定は下記のとおりです。
パラメータ | 設定内容 |
---|---|
AutomationAssumeRole | (必須)先程修正したIAM RoleのArnを指定してください |
BasePublishMessage | (オプション)適当なものを指定してください。指定が無ければAutomationでデフォルト指定したものになります。 |
retentionInDays | (オプション)指定があれば記入してください。指定がなければAutomationでデフォルト指定したもの(365日)になります。 |
logGroupName | 設定不要。リソースIDパラメータで非準拠のリソースIDが渡されます。 |
SnsTopicARN | (必須)メール通知するSNS TopicのArnを指定してください。 |
BaseNotificationSubject | (オプション)通知メールの件名を指定してください。指定が無ければAutomationでデフォルト指定したものになります。 |
動作確認
修復アクションが再設定できたら、「再評価」を実行して動作確認してみましょう。
非準拠のロググループが2つあるので、2通メールが届きました。1通目は/aws/lambda/us-east-1.my-lambda-edge-ip-restriction
というロググループに対する通知です。
メールタイトルを「CloudWatch Logs Retention Check - 対象のロググループ名」としています。また本文にもロググループ名を載せるようにしています。
2通目はcloudtrail-cloudwatchlogs-seoul
というロググループに対する通知であることが分かります。
この修復アクションを利用することで、対象のロググループ名を通知メールから確認できるようになりました。
AWS Configの画面でも「ステータス」に「修復アクションが実行された」ことが分かります。
また、CloudWatch Logsを確認すると、保持期間がたしかに12ヶ月(365日)に設定されていることも確認できました。
さらにもう少し動作確認してみます。実際の場面を想定して、「運用中にロググループが追加された時に、追加されたロググループだけアクション実行」できることを確認してみます。
改めて保持期間が設定されていないロググループ(/test/mylog-group
)を作成してみます。
AWS Config側でもう一度「再評価」を実行します。
先にチェックしていた2つのロググループが「準拠」に変わり、新たに追加したロググループを非準拠として検知しています。
CloudWatch Logsの画面で見ると、追加したロググループの保持期間が設定されていますね。
修復アクションにより、追加したロググループの通知メールだけ届きました。追加されたロググループもメールタイトルと本文から確認することができました。
もし修復アクションの実行が失敗している場合は、Systems ManagerのAutomationの画面から確認することができます。
2020年11月6日追記 : 今回ご紹介した環境をCloudFormationで作成できるようにしてみました。よろしければご参考にしていただければと思います。
最後に
AWSの環境構築をしていると、構築時点ではリソースが利用されていないことで、ロググループが出力されず保持期間を設定できないということがあります。
定期的にログの出力有無をチェックして設定する運用も面倒なので、自動でチェック・保持期間を設定する方法を考えてみました。
どなたかのお役に立てれば幸いです。